Amazon Kinesis Video Streamsを使ってストリーム映像をAWS上に流してみる【Windows(MSVC)】
1 はじめに
CX事業本部の平内(SIN)です。
AWS Kinesis Video Streams(以下、Kinesis Video Streams)では、C++,Java,Android用の プロデューサーライブラリが提供されています。
この中で、C++では、各種OS用のものをコンパイルすることで、GStreamer用のエレメント(シンク)を構築することが出来ます。
ここDevelopers.IOでもMacや、RaspberryPI上でこれを試している記事が公開されています。
Amazon Kinesis Video Streamsを使ってストリーム映像をAWS上に流してみる【MacBook Pro】– ClassmethodサーバーレスAdvent Calendar 2017
Amazon Kinesis Video Streamsを使ってストリーム映像をAWS上に流してみる【Raspberry Pi】– ClassmethodサーバーレスAdvent Calendar 2017
[Amazon Kinesis Video Streams] Dockerイメージのプロデューサーライブラリで動画配信(Raspberry Pi編)
今回、内容としては同じですが、Windows上で作業してみた時の記録です。
「プロデューサーSDKのビルドと実行」では、「Minimalist GNU for Windows (MinGW)」と「Microsoft Visual C++ Compiler (MSVC)」の2種類がドキュメントに記載されていますが、ここで試しているのは後者の方です。
なお、後者の場合は、Microsoft Visual Studio (C++)が、必要です。
参考:
Windows で C++ プロデューサー SDK を使用する
Github awslabs/amazon-kinesis-video-streams-producer-sdk-cpp
2 要件
コンパイルするための要件は、以下のとおりです。
(1) Microsoft Windows バージョン 7 以降
Windwos 10 で試しました。
(2) Microsoft .NET Framework バージョン 4.6.1 以降
.NET Frameworkは、4.8がインストールされています。
(3) Windows PowerShell バージョン 5.1
PowerShellのバージョンは、5.1.18362.145となっていました。
PS C:\Users\sin> $PSVersionTable Name Value ---- ----- PSVersion 5.1.18362.145 PSEdition Desktop PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...} BuildVersion 10.0.18362.145 CLRVersion 4.0.30319.42000 WSManStackVersion 3.0 PSRemotingProtocolVersion 2.3 SerializationVersion 1.1.0.1
(4)Git [Use Git from the Windows Command Prompt]
コマンドプロプトから、Gitが使えるようになっています。
3 コンパイル
(1) 作業場所
作業場所をC:¥kvsとしています。
> mkdir d:¥kvs > cd d:¥kvs
必要なツールのダウンロードやインストールもここで行われ、最終的にこのディレクトリは、2.7Gを超えます。
(2) git clone
GitHubのリポジトリをCloneします。
> git clone https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp.git > cd amazon-kinesis-video-streams-producer-sdk-cpp
(3) ビルドツールのインストール
ここからは、コマンドプロンプトは、管理者権限が開く必要があります。
> cd kinesis-video-native-build > vs-buildtools-install.bat
上記が完了した時点で、Visual StudioのセットアップのためWinddowsの再起動が必要です。
(4) ビルド
再起動後、再び、管理者権限でコマンドプロンプトを開き、windows-install.bat 64(システムが32ビットの場合は、windows-install.bat 32)を実行して、SDKをビルドしGeneStreamプラグイン(kvssink)を作成します。なお、windows-install.batでは、コンパイルの前に、必要なツール(CMake,jsmn,Perl,curl,GoogleTest,Log4Cplus,GStreamer等)のインストールも行われます。
> windows-install.bat 64
(5) ビルドに失敗
実は、当初コンパイルは、下記のように 「winnt.h(2487): error C2118: 添字が負の数です。」というエラーで失敗してしまいました。
ビルドに失敗しました。 "C:\kvs\amazon-kinesis-video-streams-producer-sdk-cpp\kinesis-video-native-build\pic_test.vcxproj" (既定のターゲット) (1) -> "C:\kvs\amazon-kinesis-video-streams-producer-sdk-cpp\kinesis-video-native-build\kvspic.vcxproj" (既定のターゲット) (3) -> (ClCompile ターゲット) -> c:\program files (x86)\windows kits\10\include\10.0.18362.0\um\winnt.h(2487): error C2118: 添字が負の数です。 [C:\kvs\amazon-kinesis-video-streams-producer-sdk -cpp\kinesis-video-native-build\kvspic.vcxproj] c:\program files (x86)\windows kits\10\include\10.0.18362.0\um\winnt.h(2487): error C2118: 添字が負の数です。 [C:\kvs\amazon-kinesis-video-streams-producer-sdk
Issuesに下記の記事があったので、Windwos SDKを1つ前のものに入れ替えてみて、もう一度、回してみると、今度は問題なくコンパイルできました。
windows native build x64 compilation error: incompatibility with Windows 10 SDK 18362 #242
入れ変えたWindows SDKは、Visual Studio 2019 のインストールでセットアップされた(10.0.18362.0)から、一つ前の(10.0.17763.0)へです。
4 GStreamerへのパス設定
gstreamerの各種ツールは、downloads/gstreamerの下にインストールされます。
コンパイル終了時は、パスが通されていますので、そのまま利用可能ですが、次回以降は、ここへのパスの設定が必要です。
> gst-launch-1.0 --version gst-launch-1.0 version 1.14.1 GStreamer 1.14.1 Unknown package origin
GStreamerへのパス設定は、以下のようになります。
set PATH=%PATH%;C:\kvs\amazon-kinesis-video-streams-producer-sdk-cpp\kinesis-video-native-build\downloads\gstreamer\1.0\x86_64\bin
5 GStreamerのライブラリのパス設定
コンパイルして生成したkvssinkは、ライプラリパスを通さないと利用できません。
>gst-inspect-1.0 kvssink No such element or plugin 'kvssink'
コンパイルされた、gstreamerのエレメントは、Releaseの下に置かれます。Windowsでのkvssinkの実体は、gstkvssink.dllです。
また、gstreamerの各種シンクは、downloads\gstreamer\1.0\x86_64\lib\gstreamer-1.0に入っています。
gstreamerで利用可能なようにライブラリへのパスを指定する要領は、以下のとおりとなります。
kvssinkへのパスをGST_PLUGIN_PATHとする
set GST_PLUGIN_PATH=C:\kvs\amazon-kinesis-video-streams-producer-sdk-cpp\kinesis-video-native-build\Release
gstreamerのプラグインの場所を指定する(上記のGST_PLUGIN_PATHも追加する)
set GST_PLUGIN_SYSTEM_PATH=C:\kvs\amazon-kinesis-video-streams-producer-sdk-cpp\kinesis-video-native-build\downloads\gstreamer\1.0\x86_64\lib\gstreamer-1.0 set GST_PLUGIN_SYSTEM_PATH=%GST_PLUGIN_SYSTEM_PATH%;%GST_PLUGIN_PATH%
どこからでもgstkvssink.dllが使えるようにパスも追加しておきます。
set Path=%Path%;C:\kvs\amazon-kinesis-video-streams-producer-sdk-cpp\kinesis-video-native-build\Release
gst-inspect-1.0で見えれば、kvssinkが利用可能になっています。
>gst-inspect-1.0 kvssink Factory Details: Rank primary + 10 (266) Long-name KVS Sink Klass Sink/Video/Network Description GStreamer AWS KVS plugin Author AWS KVS <[email protected]> Plugin Details: Name kvssink Description GStreamer AWS KVS plugin Filename C:\kvs\amazon-kinesis-video-streams-producer-sdk-cpp\kinesis-video-native-build\Release\gstkvssink.dll Version 1.0 License Proprietary Source module kvssinkpackage Binary package GStreamer Origin URL http://gstreamer.net/ //・・・略
6 デバイス名の取得
USBにWebカメラを接続し、gst-device-monitor-1.0コマンドを実行すると、利用可能な入力が列挙されます。
「Device found」で「HD Pro Webcam C920」が表示されており、認識され利用可能であることが分かります。
>gst-device-monitor-1.0 Device found: name : HD Pro Webcam C920 class : Video/Source caps : video/x-raw, format=(string)YUY2, width=(int)640, height=(int)480, framerate=(fraction)[ 5/1, 30/1 ], pixel-aspect-ratio=(fraction)1/1; video/x-raw, format=(string)YUY2, width=(int)160, height=(int)90, framerate=(fraction)[ 5/1, 30/1 ], pixel-aspect-ratio=(fraction)1/1; //・・・略 image/jpeg, width=(int)1600, height=(int)896, framerate=(fraction)[ 5/1, 30/1 ], pixel-aspect-ratio=(fraction)1/1; image/jpeg, width=(int)1920, height=(int)1080, framerate=(fraction)[ 5/1, 30/1 ], pixel-aspect-ratio=(fraction)1/1; gst-launch-1.0 ksvideosrc device-path="\\\\\?\\usb\#vid_046d\&pid_0892\&mi_00\#6\&b600736\&0\&0000\#\{6994ad05-93ef-11d0-a3cc-00a0c9223196\}\\global" ! ...
デバイスのパスは、上記の出力をそのままコピーして利用できます。下記では、そのままautovideosinkに送って確認しています。デバイスパスは、/dev/video0とかでは無いので、ちょっと面倒そうです。
> gst-launch-1.0 ksvideosrc device-path="\\\\\?\\usb\#vid_046d\&pid_0892\&mi_00\#6\&b600736\&0\&0000\#\{6994ad05-93ef-11d0-a3cc-00a0c9223196\}\\global" ! autovideosink
なお、入力の指定は、ksvideosrc( Windows kernel streaming plugin)も利用可能です。
gst-launch-1.0 ksvideosrc ! autovideosink
7 Kinesis Video Streamsへの送信
kvssinkのパラメータを簡略化するため、以下の環境変数を設定します。
set AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxx set AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxx set AWS_DEFAULT_REGION=ap-northeast-1
下記のコマンドで、Kinesis Video Streamsへの送信が可能です。
>gst-launch-1.0 ksvideosrc do-timestamp=TRUE ! video/x-raw,width=640,height=480,framerate=30/1 ! videoconvert ! x264enc bframes=0 key-int-max=45 bitrate=512 ! video/x-h264,profile=baseline,stream-format=avc,alignment=au ! kvssink stream-name="stream-name"
8 最後に
今回は、WindowsからKinesis Video Streamsへの送信を確認してみました。
Ubuntuと違って、min-install-scriptが使えないので、コンパイルが必要でセットアップには少し時間を要します。特に躓くところはありませんでしたが、コンパイルエラーとなる場合は、とりあえず、Windows 10 のSDKを(10.0.17763.0)に合せるのが簡単でしょう。(Visual Studio 2017だったら、そのまま行けると思います)